# python的面向对象
# 面向对象的三大要素 继承,封装,多态


# 类和对象
# 用class关键字来定义一个类
class Student(object):

    # __init__是一个特殊方法用于在创建对象时进行初始化操作
    # 通过这个方法我们可以为学生对象绑定name和age两个属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def study(self, course_name):
        print('%s正在学习%s.' % (self.name, course_name))

    # PEP 8要求标识符的名字用全小写多个单词用下划线连接
    # 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识)
    def watch_movie(self):
        if self.age < 18:
            print('%s只能看喜羊羊.' % self.name)
        else:
            print('%s正在观看岛国爱情大电影.' % self.name)

    def __test_private(self):
        print("我是私有的你访问不到！")


# 定义好了这个类 通过下面的方式来创建对象
def main():
    stu1 = Student('Satoshi', 25)
    stu1.study("做人")
    stu1.watch_movie()
    stu2 = Student('2333333', 5)
    stu2.study("打酱油")
    stu2.watch_movie()

    # 调用私有类试试
    # stu1.__test_private()     # AttributeError: 'Student' object has no attribute '__test_private'

if __name__ =='__main__':
    main()

# 但事实上 python并没有严格保证私有
class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print('__bar被访问到了')


def main():
    test = Test('hello')
    test._Test__bar()



if __name__ == "__main__":
    main()

# 由此可见属性名以单下划线开头来表示属性是受保护的是惯例,而不是语法上的规则

